#include<stdarg.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include"CQLParser.h"

// 创建非终结符节点
ParseNode* new_non_terminal_node(NodeType type, int num, ...){
    va_list ap;
    ParseNode* node = (ParseNode*)malloc(sizeof(ParseNode));
    node->children = (ParseNode**)malloc(num*sizeof(ParseNode*)+1);  // 根据传入的孩子个数分配空间
    ParseNode** temp;

    va_start(ap, num);
    node->type_ = type;
    node->num_child = num;
    temp = node->children;  // 用临时指针替代，使node->children不被改变，始终指向第一位
    
    // 根据传入的孩子个数，依次添加
    while(num--){
        *temp = va_arg(ap, ParseNode*);
        temp++;
    }

    va_end(ap);

    return node; 
}

// 非终结符节点增加孩子，增加空间
void non_terminal_add_child(ParseNode* node, int num){
    int ChildNum = node->num_child + num;  // 获取节点所需全部孩子数
    ParseNode** temp = node->children;
    node->children = (ParseNode**)realloc(temp, ChildNum*sizeof(ParseNode*)+1); // 对children重新分配空间
}

// 创建终结符节点(叶子节点)，int/bool/comparsion型
ParseNode* new_int_terminal_node(NodeType type, int num){
    ParseNode* node = (ParseNode*)malloc(sizeof(ParseNode));

    node->type_ = type;
    node->value.int_num = num;
}
// 创建终结符节点(叶子节点)，float型
ParseNode* new_float_terminal_node(NodeType type, double num){
    ParseNode* node = (ParseNode*)malloc(sizeof(ParseNode));

    node->type_ = type;
    node->value.float_num = num;
}

// 创建终结符节点(叶子节点)，string型
ParseNode* new_string_terminal_node(NodeType type, char* str){
    ParseNode* node = (ParseNode*)malloc(sizeof(ParseNode));

    node->type_ = type;
    node->value.str_value = malloc(strlen(str)+1);
    strcpy(node->value.str_value, str);
}

ParseNode* getParseTree(ParseNode* node){
    return node;
}

ParseNode* traveNode(ParseNode* node){
    // int t;
    // if( node!=NULL && node->type_>3){
    //     t=node->num_child;
    //     while(t--){
    //         printf("NodeType:%d, childNum:%d", node->type_, node->num_child);
    //         traveNode(*(node->children++));
    //     }
    // }
    printf("%d\n", node->num_child);
    printf("%d\n", node->children[0]->num_child);
    printf("%d\n", node->children[1]->num_child);
}